package com.icekrvams.air.versionchecker

import android.content.Context
import com.google.firebase.remoteconfig.FirebaseRemoteConfig
import com.google.gson.Gson
import com.google.gson.JsonSyntaxException

/**
 * 基于 FirebaseRemoteConfig 查询是否存在新版本以及新版本的基本信息。
 */
object RemoteVersionChecker {

    private const val KEY_APP_VERSION_INFO_OF_REMOTE_CONFIG = "json_app_version_in_store"

    /**
     * 异步地获取是否存在新版本，判断依据来源于 RemoteConfig 的配置。
     * @param versionCheckCallback 判断是否存在新版本的结果回调。
     */
    fun checkNewVersion(
        context: Context,
        versionCheckCallback: VersionCheckCallback
    ) {

        fun onResult(hasNewVersion: Boolean, latestVersionInfo: VersionInfo?) {
            versionCheckCallback.onResult(hasNewVersion, latestVersionInfo)
        }

        FirebaseRemoteConfig.getInstance().let { remoteConfig ->
            remoteConfig.fetchAndActivate().addOnCompleteListener { task ->
                if (!task.isSuccessful) {
                    onResult(false, null)
                    return@addOnCompleteListener
                }
                val versionInfoJson =
                    remoteConfig.getString(KEY_APP_VERSION_INFO_OF_REMOTE_CONFIG)
                if (versionInfoJson.isEmpty()) {
                    onResult(false, null)
                    return@addOnCompleteListener
                }
                try {
                    val latestVersionInfo =
                        Gson().fromJson(versionInfoJson, VersionInfo::class.java)
                    val currentVersionCode =
                        LocalVersionChecker.getCurrentVersionCode(context)
                    onResult(
                        latestVersionInfo.intVersioncode > currentVersionCode,
                        latestVersionInfo
                    )
                } catch (e: JsonSyntaxException) { // 避免FirebaseRemoteConfig不慎填错导致线上版本出现问题。
                    onResult(false, null)
                    e.printStackTrace()
                }
            }
        }
    }

    /**
     * VersionCheck 异步结果回调。
     */
   fun interface VersionCheckCallback {
        /**
         * 当 [hasNewVersion] 为true时，[latestVersionInfo]必不为空。
         * 当 [hasNewVersion] 为false时，[latestVersionInfo]有可能为空。
         */
        fun onResult(hasNewVersion: Boolean, latestVersionInfo: VersionInfo?)
    }
}